/*
 * @Author: mengxianwei mxw1@meitu.com
 * @Date: 2024-09-06 11:38:36
 * @LastEditors: mengxianwei mxw1@meitu.com
 * @LastEditTime: 2024-09-06 14:43:19
 *
 * @Description:
 * 美图云修QT 组件规范化 --- Message 全局提示
 * 全局展示操作反馈信；
 * 通知、警告、成功和错误等反馈信息；
 * 顶部居中显示并自动消失，是一种不打断用户操作的轻量级提示方式。
 * 支持定时隐藏， 默认不隐藏
 * 进入、退出动画，默认不使用动画
 *
 * 类型 ：【常规提示】【加强提示】
 *
 * 【常规提示】 icon 可使用【通知icon】【警告icon】【成功icon】【失败icon】
 * 【加强提示】 icon 可使用【警告icon】【成功icon】【失败icon】
 *
 * 注意： 文字内容不支持换行符
 *
 * https://www.figma.com/design/vjkWdi8640RkIEpKCDG9X7/%E7%BE%8E%E5%9B%BE%E4%BA%91%E4%BF%AEQT-%E7%BB%84%E4%BB%B6%E8%A7%84%E8%8C%83%E5%8C%96?node-id=574-10379&node-type=FRAME&t=M8SnvdVaboaPnm7y-0
 */

#ifndef MGLOBALTOOLTIP_H
#define MGLOBALTOOLTIP_H

#include <QFrame>
#include <QHBoxLayout>
#include <QLabel>
#include <QObject>
#include <QPropertyAnimation>
#include <QTimer>
#include <QWidget>

class MGlobalToolTip : public QWidget
{
    Q_OBJECT
  public:
    // tip 级别
    enum MessageLevel
    {
        LEVEL_REGULAR = 0, // 常规的
        LEVEL_FORTIFIED    // 加强的
    };

    // icon 类型
    enum IconType
    {
        ICON_INFO = 0,   //  通知
        ICON_WARNING,    //  警告
        ICON_SUCCESSFUL, //  成功
        ICON_FAILED,     //  失败
    };

    // 动画方向
    enum AnimationDirection
    {
        ANIMATION_NONE = 0,      // 无
        ANIMATION_LEFT_TO_RIGHT, // 从左到右
        ANIMATION_TOP_TO_DOWN,   // 从上到下
        ANIMATION_RIGHT_TO_LEFT, // 从右到左
        ANIMATION_DOWN_TO_TOP,   // 从下到上
    };

    // 窗口风格
    enum WindowStyle
    {
        STYLE_POPUP = 0, // 弹出窗口
        STYLE_CHILD,     // 嵌入窗口
    };

    /**
     * @description: 初始化创建 tooltip 对象
     * @param {MessageLevel} level tip 级别
     * @param {IconType} type icon 类型
     * @param {WindowStyle} style 窗体风格
     * @param {QWidget} *parent 父窗体指针
     * @param {int32_t} maxWidth 窗体最大宽度，当为值为 -1 时，窗体自适应文字长度
     * @return {*}
     */
    explicit MGlobalToolTip(MessageLevel level, IconType type, WindowStyle style, QWidget *parent = nullptr, int32_t maxWidth = -1);

    /**
     * @description: 窗体停留时间
     * @param {uint64_t} duration 停留时间，单位：ms ，默认 3000 ms
     * @return {*}
     */
    void setDwellTime(uint64_t duration = 3000);

    /**
     * @description: 设置窗体显示时动画
     * @param {AnimationDirection} direction 窗体进入屏幕时的动画方向
     * @param {uint64_t} duration 动画持续时长，，单位：ms ，默认 1000 ms
     * @return {*}
     */
    void setIntoAnimation(AnimationDirection direction, uint64_t duration = 1000);

    /**
     * @description: 设置窗体隐藏时动画
     * @param {AnimationDirection} direction 窗体退出屏幕时的动画方向
     * @param {uint64_t} duration 动画持续时长，，单位：ms ，默认 1000 ms
     * @return {*}
     */
    void setExitAnimation(AnimationDirection direction, uint64_t duration = 1000);

    /**
     * @description: 更新窗体配置
     * @param {MessageLevel} level tip 级别
     * @param {IconType} type icon 类型
     * @param {int32_t} maxWidth 窗体最大宽度，当为值为 -1 时，窗体自适应文字长度
     * @return {*}
     */
    void updateMsgConfig(MessageLevel level, IconType type, int32_t maxWidth = -1);

    /**
     * @description: 更新 message 内容
     * @param {QString} &msg 消息内容
     * @return {*}
     */
    void setMsgContent(const QString &msg);

  signals:
    /**
     * @description: 窗体自动隐藏后的通知
     * @return {*}
     */
    void sgnAutoHidden();

  protected:
    void showEvent(QShowEvent *event) override;
    void hideEvent(QHideEvent *event) override;
    void closeEvent(QCloseEvent *event) override;

  private:
    void refreshLayout();
    void reset();
    void createIntoAnimation(AnimationDirection direction, uint64_t duration);
    void createExitAnimation(AnimationDirection direction, uint64_t duration);
    void onDwellTimeout();

  private:
    QHBoxLayout *rootLayout_{};
    QHBoxLayout *frameLayout_{};
    QFrame *frameBackground_{};
    QLabel *labelIcon_{};
    QLabel *labelContent_{};
    QTimer *dwellTime_{};
    QPropertyAnimation *intoAnimation_{};
    QPropertyAnimation *exitAnimation_{};
    uint64_t dwellDuration_{0};
    uint64_t intoAnimationDuration_{1000};
    uint64_t exitAnimationDuration_{1000};
    AnimationDirection intoAnimationDirection_{ANIMATION_NONE};
    AnimationDirection exitAnimationDirection_{ANIMATION_NONE};
    MessageLevel msgLevel_;
    IconType iconType_;
    int32_t maxWidth_;
};

#endif // MGLOBALTOOLTIP_H
